import pandas as pd
import os

def read_excel(file_path: str) -> pd.DataFrame:
    """读取Excel文件并返回DataFrame"""
    try:
        if file_path.endswith(('.xlsx', '.xls')):
            return pd.read_excel(file_path)
        elif file_path.endswith('.csv'):
            return pd.read_csv(file_path, encoding='gbk')
        else:
            raise ValueError(f"不支持的文件格式: {os.path.splitext(file_path)[1]}")
    except Exception as e:
        raise Exception(f"读取文件失败: {str(e)}")

def save_excel(df: pd.DataFrame, file_path: str, text_columns=None) -> bool:
    """
    保存DataFrame到Excel文件，强制药品编码等长数字字段为文本格式
    
    参数:
    df: 要保存的DataFrame
    file_path: 保存路径
    text_columns: 需要设置为文本格式的列名列表，默认包含药品编码等字段
    """
    try:
        # 确保输出目录存在
        os.makedirs(os.path.dirname(file_path), exist_ok=True)
        
        # 默认文本列：优先确保药品编码处理
        if text_columns is None:
            text_columns = ['药品编码']
            text_columns = [col for col in text_columns if col in df.columns]
        
        # 策略1: 使用xlsxwriter设置文本格式（优先方案）
        try:
            import xlsxwriter
            with pd.ExcelWriter(file_path, engine='xlsxwriter') as writer:
                # 创建临时DataFrame，移除可能的单引号前缀
                temp_df = df.copy()
                for col in text_columns:
                    if col in temp_df.columns:
                        temp_df[col] = temp_df[col].astype(str).str.lstrip("'")
                
                temp_df.to_excel(writer, sheet_name='Sheet1', index=False)
                worksheet = writer.sheets['Sheet1']
                workbook = writer.book
                
                # 创建文本格式
                text_format = workbook.add_format({'num_format': '@'})
                
                # 为指定列设置文本格式（特别是药品编码）
                for col_name in text_columns:
                    if col_name in temp_df.columns:
                        col_idx = temp_df.columns.get_loc(col_name)
                        # 设置列宽和文本格式
                        worksheet.set_column(col_idx, col_idx, 15, text_format)  # 加宽列宽防止数字截断
        
            print(f"成功保存文件至: {file_path} (已为{len(text_columns)}列设置文本格式)")
            return True
            
        # 策略2: 无xlsxwriter时，使用单引号前缀强制文本格式（备选方案）
        except ImportError:
            temp_df = df.copy()
            # 对长数字字段添加单引号前缀
            for col_name in text_columns:
                if col_name in temp_df.columns:
                    # 确保值为字符串类型并添加单引号
                    temp_df[col_name] = "'" + temp_df[col_name].astype(str)
            
            temp_df.to_excel(file_path, index=False)
            print(f"成功保存文件至: {file_path} (已使用单引号前缀强制文本格式)")
            return True
            
        # 策略3: 处理极端情况（如文件权限问题）
        except Exception as e:
            print(f"保存文件时出错: {str(e)}")
            # 最终降级方案：直接保存原始数据并警告
            df.to_excel(file_path, index=False)
            print("警告: 无法应用文本格式，数据可能显示为科学计数法")
            return False
            
    except Exception as e:
        print(f"保存Excel文件失败: {str(e)}")
        return False